package com.springboot.util.pdf;

import com.springboot.ding.monitor.MonitorUtil;
import com.springboot.util.constant.CommonContract;
import com.springboot.util.file.MyFileUtil;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * @description:
 * @author: zyj
 * @create: 2020-09-09 17:25
 **/
@Component
@Slf4j
public class PdfKeyWordCoverUtil {

    /**
     * 将参数保存并且导出新的pdf
     * @param  : 需要保存的参数
     * @param url ：pdf模板路径 edit：是否可编辑
     * @return
     */
    public void pdfout(Map<String,String> datemap, String  url , String newPDFPath, boolean edit) throws Exception {

        // 模板路径
        String templatePath = url;
        //生成的新文件pdf的路径（这里的路径是博主自己的测试路径，你们要写自己的。）
        // String newPDFPath = "D:\\模板\\test.pdf";
        //pdf阅读器
        PdfReader reader;
        //文件输出流
        FileOutputStream out = null;
        //字节数组输出流在内存中创建一个字节数组缓冲区，所有发送到输出流的数据保存在该字节数组缓冲区中。
        ByteArrayOutputStream bos;
        // 使用pdfstamper修改现有文档
        PdfStamper stamper;
        Document doc = new Document();
        try {

            //输出流
            out = new FileOutputStream(newPDFPath);
            //读取pdf模板
            reader = new PdfReader(templatePath);
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();
            java.util.Iterator<String> it = form.getFields().keySet().iterator();

            for(String key : datemap.keySet()){
                String value = datemap.get(key);
                form.setField(key,value);
            }
            //true代表生成的PDF文件不可编辑，false可编辑
            stamper.setFormFlattening(edit);
            stamper.close();

            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            //循环是处理成品只显示一页的问题
            PdfImportedPage importPage = null;
            for (int  i=1;i<=reader.getNumberOfPages();i++){
                importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
                copy.addPage(importPage);
            }
            doc.close();
        } catch (Exception e){
            log.error( "将参数保存并且导出新的pdf", e);
            throw e;
        }finally {
            doc.close();
            if( null!=out){
                out.close();
            }
        }
    }

    /**
    * @Description: 将参数保存并且导出新的pdf
    * @Param: [datemap, inputFile, dictionary, edit]
    * @return: java.lang.String
    * @Author: zyj
    * @Date: 2020/9/9
    */
    public String pdfout(Map<String,String> datemap, byte[] inputFile , String dictionary, boolean edit) throws Exception {

        //pdf阅读器
        PdfReader reader;
        //文件输出流
        FileOutputStream out = null;
        //字节数组输出流在内存中创建一个字节数组缓冲区，所有发送到输出流的数据保存在该字节数组缓冲区中。
        ByteArrayOutputStream bos;
        // 使用pdfstamper修改现有文档
        PdfStamper stamper;
        //文件位置
        String newPDFPath = dictionary+ File.separator+System.currentTimeMillis()+"."+ CommonContract.pdfFileType;
        Document doc = new Document();
        try {

            //输出流
            out = new FileOutputStream(newPDFPath);
            //读取pdf模板
            reader = new PdfReader(inputFile);
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();
            java.util.Iterator<String> it = form.getFields().keySet().iterator();

            for(String key : datemap.keySet()){
                String value = datemap.get(key);
                form.setField(key,value);
            }
            //true代表生成的PDF文件不可编辑，false可编辑
            stamper.setFormFlattening(edit);
            stamper.close();
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            //循环是处理成品只显示一页的问题
            PdfImportedPage importPage = null;
            for (int  i=1;i<=reader.getNumberOfPages();i++){
                importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
                copy.addPage(importPage);
            }
            doc.close();
            return newPDFPath;
        } catch (Exception e){
            log.error( "pdf域数据填充失败(byte)", e);
            throw e;
        } finally {
            doc.close();
            if( null!=out){
                out.close();
            }
        }

    }


    /**
    * @Description: 生成临时文件
    * @Param: [datemap 替换的域值, inputFile pdf输入byte,  tempPath临时文件夹路径]
    * @return: byte[]  替换后的pdf
    * @Author: zyj
    * @Date: 2020/9/9
    */
    public byte[] getCoverPdf(Map<String,String> datemap, byte[] inputFile, String tempPath) throws Exception{

        /**step1: 创建文件夹*/
        String dictionary = File.separator+tempPath;
        boolean b = MyFileUtil.createDir(dictionary);
        if(!b){
            return null;
        }

        /**step2: 创建文件*/
        String path = pdfout(datemap, inputFile, dictionary, false);
        if(StringUtils.isEmpty(path)){
            return null;
        }

        /**step3: 获取文件流*/
        byte[] fileByte = MyFileUtil.toByteArray(path);

        /**step4: 删除临时文件*/
        MyFileUtil.deleteFile(path);

        return fileByte;
    }

    public static void main(String[] args) {
        PdfKeyWordCoverUtil pdfKeyWordCoverUtil = new PdfKeyWordCoverUtil();
        Map<String,String> datemap = new HashMap<>();
        datemap.put("1", "1滴答滴答滴答滴答滴答滴答大大大");
        datemap.put("123123123123", "对对对对对对的点点滴滴哒哒哒哒哒哒");
        try {
            pdfKeyWordCoverUtil.pdfout( datemap, "D:\\Download\\2.pdf", "D:\\Download\\22222"+System.currentTimeMillis()+".pdf", true);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}
